<?php
/**
 * --------------------------------------------------------------
 * 文档模型
 * --------------------------------------------------------------
 * Light Year Doc
 * @author yinq<3331653644@qq.com>
 * --------------------------------------------------------------
 */
namespace app\admin\model;

use think\Model;
use think\Db;
use app\admin\model\Field as FieldModel;

class Document extends Model
{
    protected $autoWriteTimestamp = true;

	/**
	 * 新增/编辑数据
	 */
	public function saveData()
	{
	    $data        = request()->post();
        $data['aid'] = AID;
		
		// 文档模型
        $model = Db::name('data_model')->where('id', $data['model_id'])->find();
        /*自动获取摘要
		if ($model['type'] != 2 && $data['summary'] == '' && config('summary') > 0) {
            $data['summary'] = mb_substr(strip_tags($data['content']), 0, config('summary'), 'utf-8');
        }
		*/
		
		// 处理自定义属性
        if (isset($data['flag'])) {
            $data['flag'] = implode(',', $data['flag']);
        }
		
		// 验证基础内容
		if (empty($data['cid'])) {
			$this->error = '请选择要发布文档的栏目';
			return false;
		}
        if ($data['title'] == '') {
            $this->error = '标题不能为空';
            return false;
        }
		
		// 处理特殊字段类型
        $fields = FieldModel::where('model_id', $data['model_id'])->where('status', 1)->column('en_title,type');
		
		foreach ($fields as $name => $type) {
            if (!isset($data[$name])) {
                switch ($type) {
                    // 开关
                    case 'switch':
                        $data[$name] = 0;
                        break;
                    case 'checkbox':
                        $data[$name] = '';
                        break;
                }
            } else {
                // 如果值是数组则转换成字符串，适用于复选框等类型
                if (is_array($data[$name])) {
                    $data[$name] = implode(',', $data[$name]);
                }
                switch ($type) {
                    // 开关
                    case 'switch':
                        $data[$name] = 1;
                        break;
                    // 日期时间
                    case 'date':
                    case 'time':
                    case 'datetime':
                        $data[$name] = strtotime($data[$name]);
                        break;
                }
            }
        }
		
		if (empty($data['id'])) {
			if ($model['type'] == 2) {
                // 新增独立模型文档
                $data['create_time'] = request()->time();
                $data['update_time'] = request()->time();
                $insert_id = Db::table($model['table'])->insertGetId($data);
                if (false === $insert_id) {
                    $this->error = '新增失败';
                    return false;
                } else {
                    return true;
                }
            } else {
                // 新增文档基础内容
                if ($document = self::create($data)) {
                    // 新增文档扩展内容
                    if ($model['table'] != '') {
                        /**
                         * 因为开启了字段是否存在的验证，所以这里只取扩展表于的字段数据
                         * 你也可以将database.php中的'fields_strict'设置为false
                         */
                        $extraData = [];
                        foreach ($fields as $name => $type) {
                            if (isset($data[$name])) {
                                $extraData[$name] = $data[$name];
                            }
                        }
                        $extraData['doc_id'] = $document['id'];
                        if (false === Db::table($model['table'])->insert($extraData)) {
                            // 删除已添加的基础内容
                            self::destroy($document['id']);
                            $this->error = '新增扩展内容出错';
                            return false;
                        }
                    }
                    return true;
                } else {
                    $this->error = '新增基础内容出错';
                    return false;
                }
            }
		} else {
			// 更新独立模型文档
            if ($model['type'] == 2) {
                // 新增独立模型文档
                $data['update_time'] = request()->time();
                if (false === Db::table($model['table'])->update($data)) {
                    $this->error = '编辑失败';
                    return false;
                } else {
                    return true;
                }
            } else {
                // 更新文档基础内容
                if (self::update($data)) {
                    // 更新文档扩展内容
                    /**
                     * 因为开启了字段是否存在的验证，所以这里只取扩展表于的字段数据
                     * 你也可以将database.php中的'fields_strict'设置为false
                     */
                    $extraData = [];
                    foreach ($fields as $name => $type) {
                        if (isset($data[$name])) {
                            $extraData[$name] = $data[$name];
                        }
                    }
                    $extraData['doc_id'] = $data['id'];
                    if (false !== Db::table($model['table'])->update($extraData)) {
                        return true;
                    } else {
                        $this->error = '更新扩展内容出错';
                        return false;
                    }
                } else {
                    $this->error = '更新基础内容出错';
                    return false;
                }
            }
		}
	}
	
	/**
     * 获取单篇文档
     * @param string $id 文档id
     * @param string $model 独立模型id
     * @param array $map 查询条件
     * @return mixed
     */
    public static function getOne($id = '', $map = [])
    {
		$document    = self::get($id);
		$extra_table = get_model_table($document['model_id']);
		$extra_table = substr($extra_table, strlen(config('database.prefix')));
	
		$data = self::view('document', true);
		if ($extra_table != '') {
			$data = $data->view($extra_table, true, 'document.id = '.$extra_table.'.doc_id', 'left');
		}
	
		return $data->view("column", ['title as column_title', 'route_name as column_route_name'], 'column.id = document.cid', 'left')
			->view("admin", 'adminname', 'admin.id = document.aid', 'left')
			->where('document.id', $id)
			->where($map)
			->find();
    }
}